package ServidorKing;
import java.io.IOException;

import jogador.Jogador;
import jogoKing.Ronda;

import jogoKing.leilao.RespostasLeilao;
import mensagem.MCarta;
import mensagem.MIdJogador;
import mensagem.MObject;
import mensagem.MObjectArray;
import mensagem.MSimples;
import mensagem.TipoMensagem;
import baralho.Mao;
import baralho.carta.*;

//Estrutura
public class LigacaoJogo {
	private Carta carta;
	private RespostasLeilao resposta;
	//private MIdJogador mensagem;
	private Jogador jogador_esperado;
	private boolean thread_em_espera = false;
	private boolean anular_jogo = false;
	
	public LigacaoJogo(){
		this.carta = null;
		this.resposta = RespostasLeilao.VAZIO;
	}
	
	
	public synchronized void setCarta(Carta carta){
		while(!this.vazia()){
			try{
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		this.carta = carta;
		notifyAll();
	}


	private synchronized boolean vazia() {
		if(this.carta != null || this.anular_jogo)
			return false;
		return true;
	}
	
	public synchronized Carta retiraCarta(Jogador jogador_esperado) throws TerminaJogoException{
		/*if(this.mensagem != null && this.mensagem.getTipo().equals(TipoMensagem.SERVIDOR_SAIU_JOGADOR)){
			this.jogador_esperado = jogador_esperado;
			try {
				Thread.sleep(10000);
				return null;
			} catch (InterruptedException e) {
				System.out.println("JogoKing retomado, jogador voltou");
				//Reenviar ultimo pedido ao cliente??
				try {
					this.jogador_esperado.getOutputStream().writeObject(new MObject<Mao>(TipoMensagem.SERVIDOR_MAO, this.jogador_esperado.getMao()));
					this.jogador_esperado.getOutputStream().writeObject(new MSimples(TipoMensagem.SERVIDOR_PEDECARTA));
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}*/
			
		
		this.jogador_esperado = jogador_esperado;
		while(this.vazia() && !this.anular_jogo){
			try{
				System.out.println("A esperar por Carta..");
				this.thread_em_espera = true;
				wait();
				System.out.println("Saiu do wait");
			}catch(InterruptedException e){
				return null;	// Para dar a saber ao jogo que aconteceu algo de estranho e
								// deve terminar, para no caso de estar em wait() e receber 
								// uma interrupt
				
			}
		}
		this.thread_em_espera = false;
		Carta c = this.carta;
		notifyAll();
		this.carta = null;
		if(this.anular_jogo){
			throw new TerminaJogoException();
			//return null;
		}
		return c;
	}

	public synchronized void setResposta(RespostasLeilao resposta){
		while(!this.respostaVazia()){
			try{
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		this.resposta = resposta;
		notifyAll();
	}


	private boolean respostaVazia() {
		return this.resposta.equals(RespostasLeilao.VAZIO);
	}
	
	public synchronized RespostasLeilao retiraResposta(){
		while(this.respostaVazia()){
			try{
				System.out.println("A esperar por Resposta..");
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		RespostasLeilao r = this.resposta;
		notifyAll();
		this.resposta = RespostasLeilao.VAZIO;
		return r;
	}

	
	/*public synchronized void setMensagem(MSimples mensagem){
		while(!this.vazia()){
			try{
				wait();
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		this.carta = carta;
		notifyAll();
	}*/


	public void jogadorVoltou(int id_jogador) {
		if(id_jogador == this.jogador_esperado.getId()){
			try {
				this.jogador_esperado.getOutputStream().writeObject(new MObject<Mao>(TipoMensagem.SERVIDOR_MAO, this.jogador_esperado.getMao()));
				this.jogador_esperado.getOutputStream().writeObject(new MSimples(TipoMensagem.SERVIDOR_PEDECARTA));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
		
	}


	public synchronized void jogadorSaiu(int id_jogador){
		//if(id_jogador == this.jogador_esperado.getId()){
		 
			this.carta = null;
			this.resposta = null;
			this.anular_jogo = true;
			if(this.thread_em_espera)
				notifyAll();
			
		
		
	}
	


//	public boolean saiuJogador() {
//		if(mensagem.getTipo().equals(TipoMensagem.SERVIDOR_SAIU_JOGADOR))
//			return true;
//		return false;
//	}
	
}
